package com.hanser.hancoder.service.Impl.service;

import com.hanser.hancoder.model.dto.app.AppAddRequest;
import com.hanser.hancoder.model.dto.app.AppQueryRequest;
import com.hanser.hancoder.model.entity.App;
import com.hanser.hancoder.model.entity.User;
import com.hanser.hancoder.model.vo.AppVO;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用 服务层。
 *
 * @author Hanserwei
 */
public interface AppService extends IService<App> {
    /**
     * 异步生成应用截图，并更新应用信息
     *
     * @param appId        应用ID
     * @param appDeployUrl 应用部署地址
     */
    void generateAppScreenshotAsync(Long appId, String appDeployUrl);

    /**
     * 获取应用封装类
     *
     * @param app 应用实体对象
     * @return 转换后的应用视图对象
     */
    AppVO getAppVO(App app);

    /**
     * 部署应用
     *
     * @param appId     应用ID
     * @param loginUser 登录用户
     * @return 部署结果
     */
    String deployApp(Long appId, User loginUser);

    /**
     * 根据查询条件构建 MyBatis-Flex 查询包装器
     *
     * @param appQueryRequest 应用查询请求参数封装对象
     * @return 构建好的查询包装器
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * 批量将 App 实体列表转换为 AppVO 视图对象列表
     *
     * @param appList 应用实体列表
     * @return 转换后的应用视图对象列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    Long createApp(AppAddRequest appAddRequest, User loginUser);

    /**
     * 聊天生成代码
     *
     * @param appId     应用ID
     * @param message   聊天内容
     * @param loginUser 登录用户
     * @return 生成的代码
     */
    Flux<String> chatToGenCode(Long appId, String message, User loginUser);
}
